#ifndef PROJECT_H
#define PROJECT_H

#include <QObject>
#include <QAction>
#include <QMenu>

#include <vector>
#include <fstream>
#include <string>

#include <QPainterPath>

#include "XML/Document.h"
#include "XML/Element.h"

#include "Atlas/atlas.h"
#include "component/component.h"
#include "Atlas/newatlas.h"
#include "Atlas/atlas.h"
#include "component/piximage.h"
#include <algorithm>

using namespace std;

/*! @brief  La classe Project conserve toutes les informations relatives à un projet
 *          Elle hérite de la classe Component pour permettre sa visualisation à l'intérieur du gestionnaire
 *          de fichier
 *
 *      Informations comprises à l'intérieur du projet :
 *
 *      *   Les composants crées
 *      *   La racine du projet
 */
class Project   :   public Component
{
    Q_OBJECT

    /******************************************
     *              Public
     ******************************************/
     public:

        /******************************************
         *              Constructors
         ******************************************/

            /*! @brief Charge un projet depuis un fichier  */
            Project(string filePath);

            /*! @brief Crée un nouveau projet en spécifiant son chemin et son nom */
            Project(string path, string name);

        /******************************************
         *              Methods
         ******************************************/

            void    Save();
            void    Load(string path);
            string  FileLocation();

            /******************************************
             *              Get
             ******************************************/

                const string & Path() const;
                const string & Name() const;

                /******************************************
                 *              Static
                 ******************************************/

                    static  Project & CurrentProject();

            /******************************************
             *              Set
             ******************************************/

        /******************************************
         *              Virtual
         ******************************************/

            void    Save(ofstream & file);
            void    Save(xml::Document & document);

            QMenu * GetContextualMenu();
            void    ExeContextualMenu(QAction *act);

        /******************************************
         *              Properties
         ******************************************/

    /******************************************
     *              Private
     ******************************************/
    private:

        /******************************************
         *              Methods
         ******************************************/

            void    SaveChilds(xml::Element &element);
            string  ConvertPath();

        /******************************************
         *              Properties
         ******************************************/

            string              m_Path;
            string              m_Name;

            /*!< Enregistre tout les composants du projet courant */
            vector<Component *> m_Components;

            /******************************************
             *              Static
             ******************************************/

                static  Project *   m_CurrentProject;

    /******************************************
     *              Signals
     ******************************************/
    signals:

    /******************************************
     *              Slots
     ******************************************/
    public slots:

        void NewAtlasComponent();   // Invoque le widget permettant de créer un nouvel atlas
        void CreateNewAtlas(int width, int height);

        void NewImage();

};

#endif // PROJECT_H
